#ifndef IP2366_H
#define IP2366_H

#include "i2c.h"

#define IP2366_READ 0xEB
#define IP2366_WRITE 0xEA
// 以下是读写寄存器
#define SYS_CTL0 0x00        // charge 使能寄存器
#define SYS_CTL2 0x02        // Vset 充满电压设定
#define SYS_CTL3 0x03        // Iset 充电功率或电流设置
#define SYS_CTL6 0x06        // 涓流充电电流设置
#define SYS_CTL8 0x08        // 停充电流和再充电阈值设置
#define SYS_CTL9 0x09        // 待机使能和低电电压设置
#define SYS_CTL10 0x0A       // 电池低电电压设置
#define SYS_CTL11 0x0B       // 输出使能寄存器
#define SYS_CTL12 0x0C       // 输出最大功率选择寄存器
#define TypeC_CTL8 0x22      // TYPE-C 模式控制寄存器
#define TypeC_CTL9 0x23      // 输出 Pdo 电流设置寄存器
#define TypeC_CTL10 0x24     // 5VPdo 电流设置寄存器
#define TypeC_CTL11 0x25     // 9VPdo 电流设置寄存器
#define TypeC_CTL12 0x26     // 12VPdo 电流设置寄存器
#define TypeC_CTL13 0x27     // 15VPdo 电流设置寄存器
#define TypeC_CTL14 0x28     // 20VPdo 电流设置寄存器
#define TypeC_CTL23 0x29     // Pps1 Pdo 电流设置寄存器
#define TypeC_CTL24 0x2A     // Pps2 Pdo 电流设置寄存器
#define TypeC_CTL17 0x2B     // 输出 Pdo 设置寄存器
#define TYPEC_CTL18 0x2C     // PDO 加 10mA 电流使能
                             // 以下是只读寄存器
#define STATE_CTL0 0x31      // 充电状态控制寄存器
#define STATE_CTL1 0x32      // 充电状态控制寄存器
#define STATE_CTL2 0x33      // 输入 Pd 状态控制寄存器
#define TypeC_STATE 0x34     // 系统状态指示寄存器
#define STATE_CTL3 0x38      // 系统过流指示寄存器
#define BATVADC_DAT0 0x50    // VBAT 电压寄存器L
#define BATVADC_DAT1 0x51    // VBAT 电压寄存器H
#define VsysVADC_DAT0 0x52   // Vsys 电压寄存器L
#define VsysVADC_DAT1 0x53   // Vsys 电压寄存器H
#define TIMENODE1 0x69       // 时间戳寄存器第一位
#define TIMENODE2 0x6A       // 时间戳寄存器第二位
#define TIMENODE3 0x6B       // 时间戳寄存器第三位
#define TIMENODE4 0x6C       // 时间戳寄存器第四位
#define TIMENODE5 0x6D       // 时间戳寄存器第五位
#define IBATIADC_DAT0 0x6E   // BAT 端电流寄存器L
#define IBATIADC_DAT1 0x6F   // BAT 端电流寄存器H
#define ISYS_IADC_DAT0 0x70  // Isys 端电流寄存器L
#define ISYS_IADC_DAT1 0x71  // Isys 端电流寄存器H
#define Vsys_POW_DAT0 0x74   // Vsys 端功率寄存器L
#define Vsys_POW_DAT1 0x75   // Vsys 端功率寄存器H
#define INTC_IADC_DAT0 0x77  // NTC 输出电流寄存器
#define VGPIO0_NTC_DAT0 0x78 // VGPIO0_NTC_ADC 电压寄存器L
#define VGPIO0_NTC_DAT1 0x79 // VGPIO0_NTC_ADC 电压寄存器H

typedef struct
{
    // 初始化需要定义的部分
    I2C_HandleTypeDef *ip2366i2c;
    GPIO_TypeDef *IP_INT_GPIOx;
    uint16_t IP_INT_GPIO_Pin;
    uint8_t type;
    uint16_t battery_Vempty;
    uint16_t battery_Vfull;
    uint16_t battery_capacity;

    int32_t current_consumed;
    int32_t energy_consumed;
    int16_t temperature;
    uint16_t voltages[10];
    int16_t current_battery;
    uint8_t id;
    uint8_t battery_function;
    int8_t battery_remaining;
    int32_t time_remaining;
    uint8_t error_state;
    uint16_t voltages_ext[4];
    uint8_t mode;
    uint32_t fault_bitmask;
} ip2366_state_t;

void IP2366_Init(ip2366_state_t *ip);
uint16_t IP2366_GetVbat(ip2366_state_t *ip);
void IP2366_GetState(ip2366_state_t *ip);
void IP2366_Sleep(ip2366_state_t *ip);
void IP2366_Enable(ip2366_state_t *ip);
void IP2366_Blink(ip2366_state_t *ip);

#endif // !IP2366_H
